package com.eliza.kotlin.design.creation.single

import com.eliza.ktor.all.library.utils.ToolsLog


/*-*- coding:utf-8 -*-
 * @Author  : debi
 * @Time    : 6/4/22
 * @Software: IntelliJ IDEA
 */

/*
* 懒汉 静态内部类：
*/
/**静态内部类单例模式中实例由内部类创建，由于 JVM 在加载外部类的过程中,
 *  是不会加载静态内部类的, 只有内部类的属性/方法被调用时才会被加载, 并初始化其静态属性。
 *  静态属性由于被 `static` 修饰，保证只被实例化一次，并且严格保证实例化顺序。*/
/**
 * 	静态内部类单例模式是一种优秀的单例模式，是开源项目中比较常用的一种单例模式。在没有加任何锁的情况下，保证了多线程下的安全，并且没有任何性能影响和空间的浪费。
 * */

private class LazySingleton5 {

    //1，私有构造方法
    private constructor()

    //定义一个静态内部类

    companion object {
        private class SingletonHolder {
            companion object {
                val INSTANCE = LazySingleton5()
            }
        }

        /*kotlin 第二种方式 :只有static  属性或方法时*/
        private object SingletonHolder2 {
            val INSTANCE = LazySingleton5()

        }

        fun getInstance() = SingletonHolder.INSTANCE

        fun getInstance2() = SingletonHolder2.INSTANCE
    }
}

fun main() {

    //创建Singletion类的对象
    val instance = LazySingleton5.getInstance()

    val instance1 = LazySingleton5.getInstance()


    //判断获取到的两个是否是同一个对象
    ToolsLog.LogPrintln(instance === instance1, 10)


    //判断获取到的两个是否是同一个对象
    ToolsLog.LogPrintln(LazySingleton5.getInstance2() === LazySingleton5.getInstance2(), 11)


}